<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 普通模式中，如果一个变量没有声明就赋值，默认是全局变量
        // 严格模式下，禁止这种用法，变量必须先声明再使用
        function foo(){
            a = 2; //不报错
        }
        foo();
        function fee(){
            'use strict';
            a = 2;  //报错
        }
        fee();
        // 普通模式中，在全局作用域函数中的 this 指向 window 对象
        // 严格模式下，全局作用域中函数中的 this 是 undefined
        function fun2() {
            console.log(this);
        }
        fun2(); //window
        function fun2() {
            "use strict";
            console.log(this);
        }
        fun2(); //undefined

        // 普通模式中，构造函数不加 new 也可以调用，this 指向全局对象
        // 严格模式下，构造函数不加 new 调用，this 报错 undefined.name 
        function Person(name){
            this.name = name;
            this.showInfo = function(){
                console.log("i`m"+this.name);
            }
        }
        var p1 = Person("Jack"); //this 指向全局对象 故是window.name 是window.showInfo 无p1.name;p1.showInfo()
        

        function Person(name){
            'use strict'
            this.name = name;
            this.showInfo = function(){
                console.log("i`m"+this.name); //this是undefined
            }
        }
        var p1 = Person("Jack"); //报错 Cannot set properties of undefined (setting 'name')at Person 
        
        // 普通模式中，函数允许参数重名
        // 严格模式下，函数参数不允许重名
        function fun4(a, a) {
            // "use strict";
            a = 5;
            console.log(a); //5
            console.dir(arguments); //Arguments(2)0: 1 1: 5
        }
        fun4(1, 2);

        //严格模式检测
        "use strict"
        function isStrictMode() {
            return this == undefined?true:false;
            // var isStrict;
            // if(this == window){
            //     isStrict = false;
            // }else{
            //     isStrict = true;
            // }
            // return isStrict;
        }
        isStrictMode();
        
    </script>
</body>
</html>